package busco

import "wails/schema/enums/busenum"

// 任务流程: 发布->接受->接受奖励->完成->完成奖励->自动接受后续任务
// 获得任务方式：
// 1. 活动上线时自动接受任务
// 2. 从NPC接受任务
// 活动任务过期后会清理实体的任务数据
// 成就任务、主线任务等需要保存任务状态，统计数据可配置保留或删除，以节省内存
// 场景：激战2中的物品收藏成就，使用条件监控用于收藏的卡包的数量
// @schema_export --ident=schema --json --config=任务
// @schema_go
// @cache_go
// @cache_ts
// @alias 任务
type B任务 struct {
	// 起源任务必须设置
	// 子任务不能设置
	// @alias 功能
	G功能 string `link:"功能"`

	// @alias 功能主体
	G功能主体 busenum.G功能主体

	// @alias 名称
	M名称 string

	// @alias 描述
	M描述 string

	// 通常用于客户端查找任务使用
	// @alias 标识
	M标识 string `alias:"标识"`

	// @alias 分类
	F分类 string

	// @alias 得分集
	D得分集 map[string]string `link:"得分"`

	// 用于查找、分类。例如日常，成就等
	// @alias 标签
	B标签 map[string]string

	// @alias 显示条件
	X显示条件 map[string]string `link:"条件"`
	// 用于生成任务页面的导航树
	// @alias 导航路径
	D导航路径 string

	// 由系统设置
	// @alias 父任务
	F父任务 string `link:"任务"`
	// 任务的自定义配置属性
	// 通常用于公式中获取数据表的对应行的数据
	// @alias 属性
	S属性 map[string]float64

	// @alias 标旗
	B标旗 map[busenum.R任务标旗]bool

	// 符合条件才能发布任务。通常用于客户端任务卡包或者npc的任务，判断是否可以发布。
	// 场景：根据职业、等级、是否具有某个物品等
	// @alias 发布条件
	F发布条件 map[string]string `link:"条件"`

	// 符合条件才能接受任务。通常用于从NPC处接任务时作为判断条件
	// 接受任务后，进入任务进行时；接受的时间，为任务的开始时间
	// 注：【条件_时间】不能使用任务的开始时间：因为任务接受后才有开始时间
	// 场景：根据职业、等级、是否具有某个物品等
	// @alias 接受条件
	J接受条件 map[string]string `link:"条件"`

	// 如果设置了[接受消耗]，则无法自动接受
	// 场景：需要消耗某资源或者物品才能接受任务
	// @alias 接受消耗
	J接受消耗 string `link:"消费"`

	// 接受任务获得的奖励
	// 场景：接受任务后，获得一个收集器，收集指定数量的物品。
	// @alias 接受奖励
	J接受奖励 string `link:"奖励"`

	// @alias 接受执行
	J接受执行 string `link:"执行"`

	// @alias 接受创建存档
	J接受创建存档 string `link:"存档"`

	// 接受任务并启动后，开始进行统计。统计数据可以用于各种条件判断，例如【完成条件】。
	// 任务结束后，默认清理统计数据
	// @alias 接受创建统计
	J接受创建统计 map[string]string `link:"统计"`
	// 如果公会、游戏服的起源任务通常设置为时间条件，并提供更多的起源任务或子任务给玩家完成
	// 如果未设置完成条件，则任务无法完成。
	// 场景：X等级以上才能完成任务
	// @alias 完成条件
	W完成条件 map[string]string `link:"条件"`

	// 场景：需要消耗某资源或者卡片才能完成任务
	// @alias 完成消耗
	W完成消耗 string `link:"消费"`

	// 完成任务获得的奖励
	// @alias 完成奖励
	W完成奖励 string `link:"奖励"`

	// @alias 完成执行
	W完成执行 string `link:"执行"`

	// @alias 完成后续任务
	W完成后续任务 string `link:"任务"`

	// 接受任务后，任务失败的条件
	// 符合所有条件设置成已失败状态
	// 在已失败状态时，消耗【失败消耗】设置的物资，获得【失败奖励】作为安慰奖，并执行【失败执行】的操作
	// 如果未设置失败条件，则任务永远不会失败
	// 场景：超过指定时间，任务失败
	// 场景：需要保护的单位被击杀，任务失败
	// @alias 失败条件
	S失败条件 map[string]string `link:"条件"`

	// 消耗不足时，物资降低到最小值
	// 场景：任务失败后，将失去一些物品或者资源
	// @alias 失败消耗
	S失败消耗 string `link:"消费"`

	// 任务失败获得的奖励
	// 场景：任务失败后，获得的安慰奖
	// @alias 失败奖励
	S失败奖励 string `link:"奖励"`

	// @alias 失败执行
	S失败执行 string `link:"执行"`
	// @alias 失败后续任务
	S失败后续任务 string `link:"任务"`

	// 角色任务不用设置结束条件；公会、游戏服任务需要设置结束条件。通常为时间条件
	// @alias 结束条件
	J结束条件 map[string]string `link:"条件"`
	// @alias 结束执行
	J结束执行 string `link:"执行"`
	// @alias 结束后续任务
	J结束后续任务 string `link:"任务"`

	// 重置当前任务及其子任务的所有状态
	// 接受后的才可以重置
	// 场景：每日任务，每周任务
	// @alias 重置条件
	C重置条件 map[string]string `link:"条件"`

	// @alias 放弃选项
	F放弃选项 busenum.R任务放弃选项

	// 符合条件才能启用强制完成，此时可 [强制完成消耗] 直接完成任务
	// 场景: 每日签到失败后可补签
	// 场景: RMB玩家用元宝可强制完成任务
	// @alias 强制完成条件
	Q强制完成条件 map[string]string `link:"条件"`

	// @alias 强制完成消耗
	Q强制完成消耗 string `link:"消费"`

	// @alias 子任务
	Z子任务 *Z子任务设置
}

type Z子任务设置 struct {
	// @alias 任务集
	R任务集 map[string]string `link:"任务"`
	// @alias 索引模式
	S索引模式 busenum.R任务集索引模式
	// 连续完成任务的奖励
	// 分两种情况，一种是失败后，后续不再奖励；一种是失败后，重新计数
	// @alias 连续奖励
	L连续奖励 map[string]string `link:"连续奖励"`
	// 达到[完成最小计数]，当前任务完成。如果为0，需要完成所有任务。
	// 只作为其中一个完成条件
	// @alias 完成最小计数
	W完成最小计数 int
	// 达到[失败最小计数]，当前任务失败。如果为0，不检查
	// 只作为其中一个失败条件
	// @alias 失败最小计数
	S失败最小计数 int
	// 完成的任务数量达到[计数]后，可获得的奖励
	// @alias 计数奖励
	J计数奖励 []*S任务集合_计数奖励
}

// 场景：激战2中的某个任务需要完成多个子任务
// @schema_export --ident=schema --json --config=任务
// @schema_go
// @cache_go
// @cache_ts
// @alias 任务_集合
type B任务_集合 struct {
	B任务

	// @alias 标旗_集合
	B标旗_集合 map[busenum.R任务集合标旗]bool

	// @alias 任务集
	R任务集 []*S任务集合项
	// @alias 索引模式
	S索引模式 busenum.R任务集索引模式
}

type S任务集合项 struct {
	// @alias 任务
	R任务 string `link:"任务"`
	// @alias 连续奖励
	// 连续完成可获得的奖励
	L连续奖励 string `link:"连续奖励"`
}

// 根据条件选则其中一个任务
// 场景：不同职业获得不同的任务
// @schema_export --ident=schema --json --config=任务
// @schema_go
// @cache_go
// @cache_ts
// @alias 任务_选择
type B任务_选择 struct {
	B任务

	// @alias 任务集
	R任务集 []*S任务选择项
}
type S任务选择项 struct {
	// @alias 任务
	R任务 string `link:"任务"`
	// @alias 条件
	X条件 map[string]string `link:"条件"`
}

type S任务集合_计数奖励 struct {
	// @alias 目标计数
	M目标计数 string `link:"目标计数"`
	// 达到目标可获得的奖励
	// @alias 完成奖励
	W完成奖励 string `link:"完成奖励"`
}
